package com.qf.service.impl;

import com.qf.config.IdWorker;
import com.qf.constant.CacheConstants;
import com.qf.constant.RabbitMQConstants;
import com.qf.constant.ReportStateConstants;
import com.qf.constant.SourceType;
import com.qf.enums.InterfaceExceptionEnums;
import com.qf.feign.CacheFeign;
import com.qf.form.SmsInterfaceForm;
import com.qf.model.StandardSubmit;
import com.qf.service.SmsService;
import com.qf.util.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author 千锋教育
 * @Company http://www.mobiletrain.org/
 * @Version 1.0
 */
@Service
@Slf4j
public class SmsServiceImpl implements SmsService {


    @Autowired
    RabbitTemplate template;

    @Autowired
    CacheFeign cacheFeign;

    @Autowired
    IdWorker idWorker;
    // 发送短信消息到  消息队列
    @Override
    public Result sendSMS(SmsInterfaceForm interfaceForm) {

        Result result = this.checkInterfaceForm(interfaceForm);
        if(result != null) {
            return result;
        }
        //转换SrcId 为Long
        String srcIDStr = interfaceForm.getSrcID();
        Long srcId = null;
        if(!StringUtils.isEmpty(srcIDStr)) {
            try {
                srcId = Long.parseLong(srcIDStr);
            } catch (NumberFormatException e) {
                e.printStackTrace();
                log.info("[接口模块 -- 数据校验] " + InterfaceExceptionEnums.INTERFACE_SRC_ID_ERROR.getMessage());
                return Result.error(InterfaceExceptionEnums.INTERFACE_SRC_ID_ERROR);
            }
        }


        //客户端id
        String clientID = interfaceForm.getClientID();
        //根据根据客户端id获取 客户端的信息
        String key = CacheConstants.CACHE_PREFIX_CLIENT + clientID;
        Map<String, String> map = cacheFeign.hMGet(key);

        //校验通过后， 把 发送短信的请求  转换到mq

        String mobiles = interfaceForm.getMobile();
        String[] arr = mobiles.split(",");
        //循环mobile， 每个手机号都需要发送一条短信（一个mq消息）
        for (String mobile : arr) {
            StandardSubmit submit = new StandardSubmit();
            //设置唯一的id
            submit.setSequenceId(String.valueOf(idWorker.nextId()));
            //设置SrcId
            submit.setSrcSequenceId(srcId);
            //发送时间
            submit.setSendTime(new Date());
            //设置客户端的id
            submit.setClientID(Integer.parseInt(interfaceForm.getClientID()));
            //设置短信内容
            submit.setMessageContent(interfaceForm.getContent());
            //设置短信的优先级
            String priority = map.get("priority");
            submit.setMessagePriority(Short.parseShort(priority));
            //设置 目标手机号
            submit.setDestMobile(mobile);
            //短信的来源
            submit.setSource(SourceType.HTTP);

            //设置短信的状态
            submit.setReportState(ReportStateConstants.WAIT);

            template.convertAndSend(RabbitMQConstants.TOPIC_PRE_SEND + "_exchange","routingKey", submit);
        }

        return Result.ok("操作成功");
    }

    private Result checkInterfaceForm(SmsInterfaceForm interfaceForm) {

        //客户端id
        String clientID = interfaceForm.getClientID();
        //根据根据客户端id获取 客户端的信息
        String key = CacheConstants.CACHE_PREFIX_CLIENT + clientID;
        Map<String, String> map = cacheFeign.hMGet(key);
        //判断是否 有次客户端
        if(map == null || map.size() == 0) {
            log.info("[接口模块 -- 数据校验] " + InterfaceExceptionEnums.INTERFACE_CLIENT_ID_ERROR.getMessage());
            return Result.error(InterfaceExceptionEnums.INTERFACE_CLIENT_ID_ERROR);
        }

        //判断密码是否正确
        String pwd = interfaceForm.getPwd();
        String pwd1 = map.get("pwd");
        if(StringUtils.isEmpty(pwd) || !pwd.equalsIgnoreCase(pwd1)) {
            log.info("[接口模块 -- 数据校验] " + InterfaceExceptionEnums.INTERFACE_PWD_ERROR.getMessage());
            return Result.error(InterfaceExceptionEnums.INTERFACE_PWD_ERROR);
        }

        // 发起请求的ip地址
        String ip = interfaceForm.getIp();
        boolean flag = false;
        //校验 ip是否 在白名单
        String ipaddress = map.get("ipaddress");
        if(!StringUtils.isEmpty(ipaddress)) {
            String[] ipArr
                    = ipaddress.split(",");

            for (String s : ipArr) {
                //如果相同，说明在白名单范围内
                if(ip.equalsIgnoreCase(s)) {
                    flag = true;
                }
            }

        }

        //如果循环完了 ，flag = false， 说明不在白名单范围内
        if(!flag) {
            log.info("[接口模块 -- 数据校验] " + InterfaceExceptionEnums.INTERFACE_IP_ERROR.getMessage());
            return Result.error(InterfaceExceptionEnums.INTERFACE_IP_ERROR);
        }


        //判断内容是否超过 500字
        String content = interfaceForm.getContent();
        if(StringUtils.isEmpty(content) || content.length() > 500) {
            log.info("[接口模块 -- 数据校验] " + InterfaceExceptionEnums.INTERFACE_CONTENT_ERROR.getMessage());
            return Result.error(InterfaceExceptionEnums.INTERFACE_CONTENT_ERROR);
        }



        //校验手机号
        String mobiles = interfaceForm.getMobile();
        if(StringUtils.isEmpty(mobiles)) {
            log.info("[接口模块 -- 数据校验] " + InterfaceExceptionEnums.INTERFACE_MOBILE_ERROR.getMessage());
            return Result.error(InterfaceExceptionEnums.INTERFACE_MOBILE_ERROR);
        }

        // 如果不为空，切割手机号
        String[] mobileArr = mobiles.split(",");

        if(mobileArr.length == 0 && mobileArr.length > 100) {
            log.info("[接口模块 -- 数据校验] " + InterfaceExceptionEnums.INTERFACE_MOBILE_ERROR.getMessage());
            return Result.error(InterfaceExceptionEnums.INTERFACE_MOBILE_ERROR);
        }

        List<String> errorMobiles = new ArrayList<>();
        //校验手机号的正则表达式
        String regex = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";
        for (String mobile : mobileArr) {
            //如果不匹配手机号格式
            if( ! mobile.matches(regex) ) {
                //添加错误手机号码到   list集合中
                errorMobiles.add(mobile);
            }
        }

        //如果手机号码不符合要求 ， 返回手机号码错误，同时包含错误手机号
        if(errorMobiles.size() > 0) {
            log.info("[接口模块 -- 数据校验] " + InterfaceExceptionEnums.INTERFACE_MOBILE_ERROR.getMessage()+",错误的手机号码： {}" , errorMobiles);
//            return Result.error(InterfaceExceptionEnums.INTERFACE_MOBILE_ERROR);

            return Result.error(InterfaceExceptionEnums.INTERFACE_MOBILE_ERROR.getCode(),
                    InterfaceExceptionEnums.INTERFACE_MOBILE_ERROR.getMessage() + ", 错误手机号码为：" + errorMobiles);
        }


        return null;
    }
}
